package com.example.apicommon;

interface Converter<T1, T2> {
    void convert(int i);
}
public class LambdaFunction {
    /*
    // 在这个例子中，不报错，跟是不是 static 没有关系 ；和表达式 不在一个作用域内【一个方法中】，在表达式内部 可变
    static int num = 1; //  表达式 lambda 的外部变量，非 final ，在表达式内部 可变
    public static void main(String args[]) {
        Converter<Integer, String> lambda = (param) -> {
            System.out.println(String.valueOf(param + num));
            num = 2;
            System.out.println(num);
        };
        lambda.convert(2);  // 输出结果为 3
        num = 3;
    }
    */
    /*
    // 在这个例子中，不报错，跟是不是 static 没有关系 ；和表达式 不在一个作用域内【一个方法中】，在表达式内部 可变
    int num = 1; //  表达式 lambda 的外部变量，非 final ，在表达式内部 可变
    public void test() {
        Converter<Integer, String> lambda = (param) -> {
            System.out.println(String.valueOf(param + num));
            num = 2;
            System.out.println(num);
        };
        lambda.convert(2);  // 输出结果为 3
        num = 3;
    }
    public static void main(String args[]) {
        new LambdaFunction().test();
    }
    */


    /*
    public static void main(String args[]) {
        //  表达式 lambda 的外部变量 和表达式在一个作用域内【一个方法中】，在表达式内部 不可变
        int num = 1; // 等价于 final int num = 1;
        Converter<Integer, String> lambda = (param) -> {
            System.out.println(String.valueOf(param + num));
            num = 0; // 报错 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
        };
        lambda.convert(2);  // 输出结果为 3
    }
    */

    /*
    public static void main(String[] args) {
        int param = 1;
        Converter<Integer, String> lambda = (param) -> // 报错 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量
                System.out.println(String.valueOf(param));
    }
    */

}
